#pragma once
#include <unordered_map>
#include <vector>
#include <mutex>
#include <cstdint>

class TcpConnection;

/**
 * @brief 连接管理器（单例模式）
 * 
 * 维护在线用户ID到TcpConnection的映射，用于：
 * - 用户上线时注册连接
 * - 用户下线时注销连接
 * - 查找在线用户的连接（用于推送消息）
 */
class ConnectionManager
{
public:
    static ConnectionManager* getInstance();
    
    // 注册在线用户连接
    void registerConnection(uint64_t userId, TcpConnection* conn);
    
    // 注销用户连接
    void unregisterConnection(uint64_t userId);
    
    // 查找在线用户连接
    TcpConnection* getConnection(uint64_t userId);
    
    // 检查用户是否在线（仅查内存）
    bool isOnline(uint64_t userId);
    
    // 检查用户是否在线（带数据库回退）
    // checkDb=true 时，如果内存中没有，会查询数据库
    bool isOnlineWithDbFallback(uint64_t userId, bool checkDb = false);
    
    // 获取所有在线用户ID列表
    std::vector<uint64_t> getOnlineUsers();
    
private:
    ConnectionManager() = default;
    ~ConnectionManager() = default;
    ConnectionManager(const ConnectionManager&) = delete;
    ConnectionManager& operator=(const ConnectionManager&) = delete;
    
    static ConnectionManager* s_instance;
    std::unordered_map<uint64_t, TcpConnection*> m_connections;  // user_id -> connection
    std::mutex m_mutex;  // 线程安全保护
};

